package com.yifeng.dao.impl;


import com.yifeng.common.SqlStatements;
import com.yifeng.dao.UserDao;
import com.yifeng.model.User;
import com.yifeng.util.JdbcUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;


public class UserDaoImpl implements UserDao {

        /*
        模板
    负责人：未知

    功能：根据用户ID删除用户记录，实现用户管理中的删除功能

    参数：userId - 用户唯一标识ID

    返回值：删除成功返回true，失败返回false
    */
    @Override
    public boolean deleteById(Integer userId){
        String sql = SqlStatements.USER_DELETE_BY_ID; //获取sql语句
        try (Connection conn = JdbcUtil.getConnection(); //获取sql对象
             PreparedStatement ps = conn.prepareStatement(sql)) { //执行sql语句
            ps.setInt(1, userId); //设置条件
            int rows = ps.executeUpdate(); //返回结果
            return rows > 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /*
    负责人：未知 模板

    功能：将ResultSet结果集转换为User对象列表，用于多个查询方法的公共处理逻辑

    参数：rs - 数据库查询结果集

    返回值：User对象列表
    */
    private List<User> mapResultSetToList(ResultSet rs) throws SQLException {
        List<User> list = new ArrayList<>();
        while (rs.next()) {
            User user = new User();
            user.setUserId(rs.getInt("user_id"));
            user.setUserName(rs.getString("user_name"));
            user.setPassword(rs.getString("password"));
            user.setRole(rs.getString("role"));
            user.setUserAlias(rs.getString("user_alias"));
//            user.setAvatar(rs.getString("avatar"));
            user.setCreateTime(rs.getObject("create_time", LocalDateTime.class));
            list.add(user);
        }
        return list;
    }




    /*
    负责人：未知

    功能：根据用户名和密码查询用户信息，用于用户登录验证

    参数：userName - 用户名, password - 加密后的密码

    返回值：匹配的用户对象，未找到或异常时返回null
    */
    @Override
    public User findByUsernameAndPassword(String userName, String password) {
        String sql = SqlStatements.USER_FIND_BY_USERNAME_AND_PASSWORD;

        //获取数据库连接
        try (Connection conn = JdbcUtil.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setString(1, userName);
            ps.setString(2, password);

            ResultSet rs = ps.executeQuery();

            if (rs.next()) {
                User user = new User();
                user.setUserId(rs.getInt("user_id"));
                user.setUserName(rs.getString("user_name"));
                user.setRole(rs.getString("role"));
                return user;
            }
        } catch (SQLException e) {
            return null;
        }
        return null;
    }

    /*
    负责人：未知

    功能：检查用户名是否已存在，用于用户注册时的重复性校验

    参数：userName - 待检查的用户名

    返回值：用户名存在返回true，不存在或异常返回false
    */
    @Override
    public boolean existsByUsername(String userName) {
        String sql = SqlStatements.USER_EXISTS_BY_USERNAME;
        try (Connection conn = JdbcUtil.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql)){

            ps.setString(1, userName);

            ResultSet rs = ps.executeQuery();

            return rs.next();
        }catch (SQLException e){
            e.printStackTrace();
            return false;
        }
    }

    /*
    负责人：未知

    功能：插入新用户记录，用于用户注册功能

    参数：user - 包含用户信息的User对象

    返回值：插入成功返回true，失败返回false
    */
    @Override
    public boolean insert(User user) {
        String sql = SqlStatements.USER_INSERT;
        try (Connection conn = JdbcUtil.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql)){

            ps.setString(1, user.getUserName());
            ps.setString(2, user.getPassword());
            ps.setString(3, user.getRole());
            ps.setObject(4, user.getCreateTime());

            int rows = ps.executeUpdate();
            return rows > 0;

        }catch (SQLException e){
            e.printStackTrace();
            return false;
        }
    }

    /*
    负责人：未知

    功能：分页查询所有用户记录，支持用户管理界面的分页展示

    参数：offset - 数据偏移量, pageSize - 每页记录数

    返回值：用户对象列表，异常时返回空列表
    */
    @Override
    public List<User> findAll() {
        String sql = SqlStatements.USER_FIND_ALL;

        try (Connection conn = JdbcUtil.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql)){
            List<User> list = null;
            ResultSet rs = ps.executeQuery();
            //调用私有方法处理结果集
            list = mapResultSetToList(rs);
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

    /*
    负责人：未知

    功能：按角色分页查询用户，支持按角色筛选的用户管理

    参数：role - 用户角色, offset - 数据偏移量, pageSize - 每页记录数

    返回值：指定角色的用户对象列表，异常时返回空列表
    */
    @Override
    public List<User> findByRolePaginated(String role, int offset, int pageSize) {
        return null;
    }




}